利用OpenCV图像处理从图像中去除背景文本和噪声

您所在的位置:网站首页 opencv轮廓提取 速度 利用OpenCV图像处理从图像中去除背景文本和噪声

利用OpenCV图像处理从图像中去除背景文本和噪声

2023-04-26 08:59| 来源: 网络整理| 查看: 265

以下是纠正扭曲文本的两种潜在方法和方法:

方法#1:形态学运算+轮廓滤波

获得二值图像。 负载图像,灰鳞,然后是Otsu阈值。删除文本轮廓。用cv2.getStructuringElement()创建一个矩形内核,然后执行形态运算消除噪声。过滤和消除小噪音。 寻找轮廓和过滤器使用等高线面积去除小颗粒。用cv2.drawContours()填充等高线,有效地去除了噪声。执行OCR.我们倒置图像,然后应用轻微的高斯模糊。然后,我们使用青蒿琥酯和--psm 6配置选项进行OCR,将图像作为单个文本块来处理。查看特斯拉提高质量以获得改进检测的其他方法,并查看其他设置的Pytesseract配置选项。

输入图像->二值->形状开度

等高线区域滤波->反演->应用模糊技术获得结果

OCR结果

YabVzu

代码

import cv2 import pytesseract import numpy as np pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe" # Load image, grayscale, Otsu's threshold image = cv2.imread('2.png') gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1] # Morph open to remove noise kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2,2)) opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=1) # Find contours and remove small noise cnts = cv2.findContours(opening, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnts = cnts[0] if len(cnts) == 2 else cnts[1] for c in cnts: area = cv2.contourArea(c) if area < 50: cv2.drawContours(opening, [c], -1, 0, -1) # Invert and apply slight Gaussian blur result = 255 - opening result = cv2.GaussianBlur(result, (3,3), 0) # Perform OCR data = pytesseract.image_to_string(result, lang='eng', config='--psm 6') print(data) cv2.imshow('thresh', thresh) cv2.imshow('opening', opening) cv2.imshow('result', result) cv2.waitKey()

方法#2:颜色分割

通过观察到所要提取的文本与图像中的噪声有明显的对比度,我们可以使用颜色阈值来分离文本。其思想是转换为HSV格式,然后颜色阈值,以获得一个掩码使用较低/较高的颜色范围。从是我们使用相同的过程到OCR与Pytesseract。

输入图像->掩模->结果

代码

import cv2 import pytesseract import numpy as np pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe" # Load image, convert to HSV, color threshold to get mask image = cv2.imread('2.png') hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) lower = np.array([0, 0, 0]) upper = np.array([100, 175, 110]) mask = cv2.inRange(hsv, lower, upper) # Invert image and OCR invert = 255 - mask data = pytesseract.image_to_string(invert, lang='eng', config='--psm 6') print(data) cv2.imshow('mask', mask) cv2.imshow('invert', invert) cv2.waitKey()

校正失真文本

当图像是水平的时候,OCR工作得最好。为了确保文本是OCR的理想格式,我们可以执行透视图转换。在去除所有的噪声以隔离文本后,我们可以执行一个形状接近,将单个文本轮廓组合成一个单独的轮廓。从这里,我们可以使用cv2.minAreaRect找到旋转的包围框,然后使用imutils.perspective.four_point_transform执行四点透视变换。继续清洁面膜,这是结果:

掩模->形态闭合->检测旋转包围盒->结果

与另一个图像一起输出

更新后的代码以包含透视图转换

import cv2 import pytesseract import numpy as np from imutils.perspective import four_point_transform pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe" # Load image, convert to HSV, color threshold to get mask image = cv2.imread('1.png') hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) lower = np.array([0, 0, 0]) upper = np.array([100, 175, 110]) mask = cv2.inRange(hsv, lower, upper) # Morph close to connect individual text into a single contour kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5)) close = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel, iterations=3) # Find rotated bounding box then perspective transform cnts = cv2.findContours(close, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnts = cnts[0] if len(cnts) == 2 else cnts[1] rect = cv2.minAreaRect(cnts[0]) box = cv2.boxPoints(rect) box = np.int0(box) cv2.drawContours(image,[box],0,(36,255,12),2) warped = four_point_transform(255 - mask, box.reshape(4, 2)) # OCR data = pytesseract.image_to_string(warped, lang='eng', config='--psm 6') print(data) cv2.imshow('mask', mask) cv2.imshow('close', close) cv2.imshow('warped', warped) cv2.imshow('image', image) cv2.waitKey()

注意:颜色阈值范围是使用这个HSV阈值脚本确定的。

import cv2 import numpy as np def nothing(x): pass # Load image image = cv2.imread('2.png') # Create a window cv2.namedWindow('image') # Create trackbars for color change # Hue is from 0-179 for Opencv cv2.createTrackbar('HMin', 'image', 0, 179, nothing) cv2.createTrackbar('SMin', 'image', 0, 255, nothing) cv2.createTrackbar('VMin', 'image', 0, 255, nothing) cv2.createTrackbar('HMax', 'image', 0, 179, nothing) cv2.createTrackbar('SMax', 'image', 0, 255, nothing) cv2.createTrackbar('VMax', 'image', 0, 255, nothing) # Set default value for Max HSV trackbars cv2.setTrackbarPos('HMax', 'image', 179) cv2.setTrackbarPos('SMax', 'image', 255) cv2.setTrackbarPos('VMax', 'image', 255) # Initialize HSV min/max values hMin = sMin = vMin = hMax = sMax = vMax = 0 phMin = psMin = pvMin = phMax = psMax = pvMax = 0 while(1): # Get current positions of all trackbars hMin = cv2.getTrackbarPos('HMin', 'image') sMin = cv2.getTrackbarPos('SMin', 'image') vMin = cv2.getTrackbarPos('VMin', 'image') hMax = cv2.getTrackbarPos('HMax', 'image') sMax = cv2.getTrackbarPos('SMax', 'image') vMax = cv2.getTrackbarPos('VMax', 'image') # Set minimum and maximum HSV values to display lower = np.array([hMin, sMin, vMin]) upper = np.array([hMax, sMax, vMax]) # Convert to HSV format and color threshold hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) mask = cv2.inRange(hsv, lower, upper) result = cv2.bitwise_and(image, image, mask=mask) # Print if there is a change in HSV value if((phMin != hMin) | (psMin != sMin) | (pvMin != vMin) | (phMax != hMax) | (psMax != sMax) | (pvMax != vMax) ): print("(hMin = %d , sMin = %d, vMin = %d), (hMax = %d , sMax = %d, vMax = %d)" % (hMin , sMin , vMin, hMax, sMax , vMax)) phMin = hMin psMin = sMin pvMin = vMin phMax = hMax psMax = sMax pvMax = vMax # Display result image cv2.imshow('image', result) if cv2.waitKey(10) & 0xFF == ord('q'): break cv2.destroyAllWindows()


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3